{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Siamese Address Similarity with TensorFlow\n",
    "--------------------------\n",
    "\n",
    "Here, we show how to perform address matching with a Siamese RNN model.\n",
    "\n",
    "We start by loading the necessary libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import random\n",
    "import string\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import tensorflow as tf\n",
    "from tensorflow.python.framework import ops\n",
    "ops.reset_default_graph()\n",
    "\n",
    "model = __import__('siamese_similarity_model')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Start a graph session"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "sess = tf.Session()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Set the model parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "batch_size = 200     # How many addresses to train on in one batch\n",
    "n_batches = 300      # How many batches to train on\n",
    "max_address_len = 20 # How many character to crop/pad each address\n",
    "margin = 0.25        # A sort of regularization parameter that allows for 'wiggle' room in bad predicted similarities.\n",
    "num_features = 50    # RNN feature size\n",
    "dropout_keep_prob = 0.8 # Dropout probability"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "We need a function to randomly create one typo in a string."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def create_typo(s):\n",
    "    rand_ind = random.choice(range(len(s)))\n",
    "    s_list = list(s)\n",
    "    s_list[rand_ind]=random.choice(string.ascii_lowercase + '0123456789')\n",
    "    s = ''.join(s_list)\n",
    "    return(s)\n",
    "\n",
    "# Generate data\n",
    "street_names = ['abbey', 'baker', 'canal', 'donner', 'elm', 'fifth',\n",
    "                'grandvia', 'hollywood', 'interstate', 'jay', 'kings']\n",
    "street_types = ['rd', 'st', 'ln', 'pass', 'ave', 'hwy', 'cir', 'dr', 'jct']\n",
    "\n",
    "# Define test addresses\n",
    "test_queries = ['111 abbey ln', '271 doner cicle',\n",
    "                '314 king avenue', 'tensorflow is fun']\n",
    "test_references = ['123 abbey ln', '217 donner cir', '314 kings ave',\n",
    "                   '404 hollywood st', 'tensorflow is so fun']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Get a batch of size n, half of which is similar addresses, half are not"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def get_batch(n):\n",
    "    # Generate a list of reference addresses with similar addresses that have\n",
    "    # a typo.\n",
    "    numbers = [random.randint(1, 9999) for i in range(n)]\n",
    "    streets = [random.choice(street_names) for i in range(n)]\n",
    "    street_suffs = [random.choice(street_types) for i in range(n)]\n",
    "    full_streets = [str(w) + ' ' + x + ' ' + y for w,x,y in zip(numbers, streets, street_suffs)]\n",
    "    typo_streets = [create_typo(x) for x in full_streets]\n",
    "    reference = [list(x) for x in zip(full_streets, typo_streets)]\n",
    "    \n",
    "    # Shuffle last half of them for training on dissimilar addresses\n",
    "    half_ix = int(n/2)\n",
    "    bottom_half = reference[half_ix:]\n",
    "    true_address = [x[0] for x in bottom_half]\n",
    "    typo_address = [x[1] for x in bottom_half]\n",
    "    typo_address = list(np.roll(typo_address, 1))\n",
    "    bottom_half = [[x,y] for x,y in zip(true_address, typo_address)]\n",
    "    reference[half_ix:] = bottom_half\n",
    "    \n",
    "    # Get target similarities (1's for similar, -1's for non-similar)\n",
    "    target = [1]*(n-half_ix) + [-1]*half_ix\n",
    "    reference = [[x,y] for x,y in zip(reference, target)]\n",
    "    return(reference)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Define vocabulary dictionary (remember to save '0' for padding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "vocab_chars = string.ascii_lowercase + '0123456789 '\n",
    "vocab2ix_dict = {char:(ix+1) for ix, char in enumerate(vocab_chars)}\n",
    "vocab_length = len(vocab_chars) + 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Define vocab one-hot encoding.  Here we get the actual indices for usage in the embedding lookup."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def address2onehot(address,\n",
    "                   vocab2ix_dict = vocab2ix_dict,\n",
    "                   max_address_len = max_address_len):\n",
    "    # translate address string into indices\n",
    "    address_ix = [vocab2ix_dict[x] for x in list(address)]\n",
    "\n",
    "    # Pad or crop to max_address_len\n",
    "    address_ix = (address_ix + [0]*max_address_len)[0:max_address_len]\n",
    "    return(address_ix)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Now we define model placeholders."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "address1_ph = tf.placeholder(tf.int32, [None, max_address_len], name=\"address1_ph\")\n",
    "address2_ph = tf.placeholder(tf.int32, [None, max_address_len], name=\"address2_ph\")\n",
    "\n",
    "y_target_ph = tf.placeholder(tf.int32, [None], name=\"y_target_ph\")\n",
    "dropout_keep_prob_ph = tf.placeholder(tf.float32, name=\"dropout_keep_prob\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Create embedding lookup. Here we use the identidy matrix so that we have a one-hot encoded lookup."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "identity_mat = tf.diag(tf.ones(shape=[vocab_length]))\n",
    "address1_embed = tf.nn.embedding_lookup(identity_mat, address1_ph)\n",
    "address2_embed = tf.nn.embedding_lookup(identity_mat, address2_ph)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Now we define the model.  Please see the `06_siamese_similarity_model.py` for details."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "# Define Model\n",
    "text_snn = model.snn(address1_embed, address2_embed, dropout_keep_prob_ph,\n",
    "                     vocab_length, num_features, max_address_len)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Now we can define our accuracy, loss, and prediction functions.  These come from the `06_siamese_similarity_model.py` model function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "# Define Accuracy\n",
    "batch_accuracy = model.accuracy(text_snn, y_target_ph)\n",
    "# Define Loss\n",
    "batch_loss = model.loss(text_snn, y_target_ph, margin)\n",
    "# Define Predictions\n",
    "predictions = model.get_predictions(text_snn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "We declare our optimizer, training operation, and variable initialization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "# Declare optimizer\n",
    "optimizer = tf.train.AdamOptimizer(0.01)\n",
    "# Apply gradients\n",
    "train_op = optimizer.minimize(batch_loss)\n",
    "\n",
    "# Initialize Variables\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Now we loop through our training iterations and print out convergence statistics every 10 generations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Metrics, Batch 0: Loss=0.599, Accuracy=0.500.\n",
      "Training Metrics, Batch 10: Loss=0.036, Accuracy=0.730.\n",
      "Training Metrics, Batch 20: Loss=-0.007, Accuracy=0.730.\n",
      "Training Metrics, Batch 30: Loss=0.009, Accuracy=0.755.\n",
      "Training Metrics, Batch 40: Loss=0.005, Accuracy=0.785.\n",
      "Training Metrics, Batch 50: Loss=0.033, Accuracy=0.775.\n",
      "Training Metrics, Batch 60: Loss=-0.020, Accuracy=0.760.\n",
      "Training Metrics, Batch 70: Loss=0.028, Accuracy=0.700.\n",
      "Training Metrics, Batch 80: Loss=0.038, Accuracy=0.750.\n",
      "Training Metrics, Batch 90: Loss=-0.020, Accuracy=0.745.\n",
      "Training Metrics, Batch 100: Loss=0.019, Accuracy=0.740.\n",
      "Training Metrics, Batch 110: Loss=-0.014, Accuracy=0.740.\n",
      "Training Metrics, Batch 120: Loss=0.035, Accuracy=0.740.\n",
      "Training Metrics, Batch 130: Loss=0.003, Accuracy=0.780.\n",
      "Training Metrics, Batch 140: Loss=0.009, Accuracy=0.740.\n",
      "Training Metrics, Batch 150: Loss=-0.053, Accuracy=0.785.\n",
      "Training Metrics, Batch 160: Loss=-0.017, Accuracy=0.760.\n",
      "Training Metrics, Batch 170: Loss=-0.002, Accuracy=0.765.\n",
      "Training Metrics, Batch 180: Loss=0.018, Accuracy=0.760.\n",
      "Training Metrics, Batch 190: Loss=-0.000, Accuracy=0.770.\n",
      "Training Metrics, Batch 200: Loss=-0.003, Accuracy=0.750.\n",
      "Training Metrics, Batch 210: Loss=-0.007, Accuracy=0.770.\n",
      "Training Metrics, Batch 220: Loss=-0.032, Accuracy=0.810.\n",
      "Training Metrics, Batch 230: Loss=-0.039, Accuracy=0.785.\n",
      "Training Metrics, Batch 240: Loss=0.016, Accuracy=0.735.\n",
      "Training Metrics, Batch 250: Loss=0.022, Accuracy=0.730.\n",
      "Training Metrics, Batch 260: Loss=-0.025, Accuracy=0.750.\n",
      "Training Metrics, Batch 270: Loss=-0.049, Accuracy=0.790.\n",
      "Training Metrics, Batch 280: Loss=-0.024, Accuracy=0.780.\n",
      "Training Metrics, Batch 290: Loss=0.018, Accuracy=0.730.\n"
     ]
    }
   ],
   "source": [
    "# Train loop\n",
    "train_loss_vec = []\n",
    "train_acc_vec = []\n",
    "for b in range(n_batches):\n",
    "    # Get a batch of data\n",
    "    batch_data = get_batch(batch_size)\n",
    "    # Shuffle data\n",
    "    np.random.shuffle(batch_data)\n",
    "    # Parse addresses and targets\n",
    "    input_addresses = [x[0] for x in batch_data]\n",
    "    target_similarity = np.array([x[1] for x in batch_data])\n",
    "    address1 = np.array([address2onehot(x[0]) for x in input_addresses])\n",
    "    address2 = np.array([address2onehot(x[1]) for x in input_addresses])\n",
    "    \n",
    "    train_feed_dict = {address1_ph: address1,\n",
    "                       address2_ph: address2,\n",
    "                       y_target_ph: target_similarity,\n",
    "                       dropout_keep_prob_ph: dropout_keep_prob}\n",
    "\n",
    "    _, train_loss, train_acc = sess.run([train_op, batch_loss, batch_accuracy],\n",
    "                                        feed_dict=train_feed_dict)\n",
    "    # Save train loss and accuracy\n",
    "    train_loss_vec.append(train_loss)\n",
    "    train_acc_vec.append(train_acc)\n",
    "    # Print out statistics\n",
    "    if b%10==0:\n",
    "        print('Training Metrics, Batch {0}: Loss={1:.3f}, Accuracy={2:.3f}.'.format(b, train_loss, train_acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Let us test the algorithm on the test set of addresses."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Query Addresses: ['111 abbey ln', '271 doner cicle', '314 king avenue', 'tensorflow is fun']\n",
      "Model Found Matches: ['123 abbey ln', '217 donner cir', '314 kings ave', 'tensorflow is so fun']\n"
     ]
    }
   ],
   "source": [
    "# Calculate the nearest addresses for test inputs\n",
    "# First process the test_queries and test_references\n",
    "test_queries_ix = np.array([address2onehot(x) for x in test_queries])\n",
    "test_references_ix = np.array([address2onehot(x) for x in test_references])\n",
    "num_refs = test_references_ix.shape[0]\n",
    "best_fit_refs = []\n",
    "for query in test_queries_ix:\n",
    "    test_query = np.repeat(np.array([query]), num_refs, axis=0)\n",
    "    test_feed_dict = {address1_ph: test_query,\n",
    "                      address2_ph: test_references_ix,\n",
    "                      y_target_ph: target_similarity,\n",
    "                      dropout_keep_prob_ph: 1.0}\n",
    "    test_out = sess.run(text_snn, feed_dict=test_feed_dict)\n",
    "    best_fit = test_references[np.argmax(test_out)]\n",
    "    best_fit_refs.append(best_fit)\n",
    "\n",
    "print('Query Addresses: {}'.format(test_queries))\n",
    "print('Model Found Matches: {}'.format(best_fit_refs))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "This is great! The model generalizes to strings that aren't even addresses!!\n",
    "\n",
    "Now let us plot the loss and accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1bc85352e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the loss and accuracy\n",
    "%matplotlib inline\n",
    "plt.plot(train_loss_vec, 'k-', lw=2, label='Batch Loss')\n",
    "plt.plot(train_acc_vec, 'r:', label='Batch Accuracy')\n",
    "plt.xlabel('Iterations')\n",
    "plt.ylabel('Accuracy and Loss')\n",
    "plt.title('Accuracy and Loss of Siamese RNN')\n",
    "plt.grid()\n",
    "plt.legend(loc='lower right')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
